// let arr = [11, 21, 3, 7, 8, 10, 14];
// let sum = arr.reduce((pre, next) => {
//     return pre + next
// }, 10)
// console.log(sum);

// let arr2 = [1, 2, 3, ['a', ['b', 'c']]];
// let arr3=arr2.flat(2);
// console.log(arr2);
// console.log(arr3);


// let arr=['a','abc',1,10,12,'z',7];
// let arr = [{
//     name: 'zhangsan',
//     age: 18
// },
// {
//     name: 'lisi',
//     age: 20
// },
// ]
// let result1 = arr.find((item)=>item.name=='lisi');
// result1.name='zhaosi'
// console.log(result1);
// console.log(arr);


// let userObj={
//     name:'zhangsan',
//     age:18,
//     // talk:function(){
//     //     console.log('hello');
//     // }
//     talk(){
//         console.log('hello');
//     }
// };

// userObj.drive=function(){
//     console.log('过弯漂移');
// }
// userObj.drive();
// userObj.money=500;
// console.log(userObj);
// let age='age';
// console.log(userObj['age']);

// // arr.push()


// ---- 语法糖
//属性名和变量名一致时，可以简写
// let name = 'zhangsan', age = 18;
// let obj={
//     name:name,
//     age:age
// }
// let obj = {
//     name,
//     age
// }
// console.log(obj);


//---- 遍历
// for (let key in obj) {
//     console.log(key);
//     console.log(obj[key]);
// }


//---- 对象嵌套

// let family = {
//     brother: {
//         name: 'zhangsan',
//         age: 12
//     },
//     sister: {
//         name: 'xiaohong',
//         age: 14
//     }
// }
// console.log(family.brother.age);


//---- 解构
// let arr=[1,2,3,4,5,6];
// let [a,b,...c]=arr;
// console.log(a,b,c);

// let a = { name: 'a', age: 10 };
// // let { age: aAge,name: aName } = a
// let {name,age}=a
// console.log(name, age);

//===== 拓展
//---- 对象作为参数
// function foo1(user){
// console.log(`我叫${user.name},我今年${user.age}`);
// }
// foo1({age:18,name:'zhangsan'})


// function foo2(name,age){
//     console.log(`我叫${name},我今年${age}`);
// }
// foo2(20,'lisi')


// function foo3({name,age}){
//     console.log(`我叫${name},我今年${age}`);
// }
// foo3({age:22,name:'wangwu'})

//----- this关键字
// let obj={
//     name:'xiaowang',
//     age:100,
    // swimming(){
    //     console.log(this);//在对象中this指向自己
    //     console.log(`${this.name}在游泳`);
    // }

//     swimming:()=>{
//         console.log(this.name);
//     }
// }
// obj.swimming()

// function fn(){
//     console.log(this);//global
// }
// fn()

// let fn2=()=>{
//     console.log(this);
// }
// fn2()

//---- symbol

let s1=Symbol('abc');
let s2=Symbol('abc');
console.log(s1==s2);//false
let s3=Symbol();
console.log(s3);

// let name=Symbol('这是symbol类型的键');//相当于声明了一个独一无二的键
// let obj={
//     name:'zhangsan',age:18,gender:'male'
// }
// obj[name]='lisi';
// console.log(obj[name]);//lisi
// console.log(obj.name);//zhangsan
// console.log(obj['name']);//zhangsan
// obj[name]='wangwu'
// console.log(obj);
//symbol类型的值只能通过方括号访问法添加和访问

//普通的遍历方法遍历不到symbol类型的键
// for(let key in obj){
//     console.log(key);
// }

// let age=Symbol('这是symbol类型的age');
// obj[age]=1000;
// console.log(obj);
// //获取symbol类型的键
// console.log(Object.getOwnPropertySymbols(obj));


//====== 集合 set
//es6提出的新的数据结构
//集合是一组无序、但不能有重复的元素组成的

//---- 创建集合
//数组被展开放到集合中
let s=new Set([1,2,3]);
//数组作为一个元素添加
s.add([1,2,3])
s.add(1);//重复的值添加不进去
s.add(4).add(5);
s.delete(5)
console.log(s.has(20));

//---- 常见的方法
// add(value)  向集合添加一个值
// delete(value) 从集合移除一个值
// has(value)  查看是否存在某个值，存在返回true，不存在返回false
//clear()  清空集合

// console.log(s.size);//集合长度
// console.log([...s]);



// s.clear();
// console.log(s);

let s10=new Set([ 1, 2, 3,1,3 ]);
console.log(s10);
let arr=[...s10]
console.log(arr);